package br.com.news.application.buttons;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JOptionPane;

import org.apache.log4j.Logger;

import br.com.news.application.enumerations.ButtonTypeEnum;
import br.com.news.application.interfaces.ICategoriaData;
import br.com.news.application.interfaces.ICategoriaGrid;
import br.com.news.utils.database.beans.CategoriaBean;

public class CategoriaButton extends JButton {

	private static final long serialVersionUID = -7431880216186965304L;

	private final Logger logger = Logger.getLogger(this.getClass());

	private final ButtonTypeEnum typeButton;
	private final ICategoriaGrid categoriaGrid;
	private final ICategoriaData categoriaData;

	public CategoriaButton(ButtonTypeEnum typeButton, ICategoriaGrid categoriaGrid, ICategoriaData categoriaData) {
		super(typeButton.getText());

		this.typeButton = typeButton;
		this.categoriaGrid = categoriaGrid;
		this.categoriaData = categoriaData;

		loadActionListener();
	}

	private void loadActionListener() {

		switch (this.typeButton) {
		case DELETE:
			addActionListener(new ActionListener() {
				@Override
				public void actionPerformed(ActionEvent e) {
					CategoriaBean categoria = new CategoriaBean();

					categoria.setIdCategoria(CategoriaButton.this.categoriaData.getCategoriaId());

					if (CategoriaButton.this.logger.isDebugEnabled()) {
						CategoriaButton.this.logger.debug(String.format("Invoke service to insert the category [%s].", categoria));
					}

					try {
						CategoriaButton.this.categoriaGrid.getService().deleteCategoria(categoria);

						CategoriaButton.this.fillCategories();
					} catch (Exception ex) {
						JOptionPane.showMessageDialog(CategoriaButton.this, "N�o foi poss�vel acessar os servi�os remotos.");
					}
				}
			});
			break;

		case FIND:
			addActionListener(new ActionListener() {
				@Override
				public void actionPerformed(ActionEvent e) {
					try {
						CategoriaButton.this.fillCategories();
					} catch (Exception ex) {
						JOptionPane.showMessageDialog(CategoriaButton.this, "Não foi possovel acessar os serviços remotos.");
					}
				}
			});
			break;

		case INSERT:
			addActionListener(new ActionListener() {
				@Override
				public void actionPerformed(ActionEvent e) {
					CategoriaBean categoria = new CategoriaBean();

					categoria.setDescricao(CategoriaButton.this.categoriaData.getCategoriadescricao());
					categoria.setStatus(CategoriaButton.this.categoriaData.getCategoriaStatus());

					if (CategoriaButton.this.logger.isDebugEnabled()) {
						CategoriaButton.this.logger.debug(String.format("Invoke service to insert the category [%s].", categoria));
					}

					try{
						CategoriaButton.this.categoriaGrid.getService().insertCategoria(categoria);

						CategoriaButton.this.fillCategories();
					} catch (Exception ex) {
						JOptionPane.showMessageDialog(CategoriaButton.this, "Não foi possovel acessar os serviços remotos.");
					}
				}
			});
			break;

		case UPDATE:
			addActionListener(new ActionListener() {
				@Override
				public void actionPerformed(ActionEvent e) {
					CategoriaBean categoria = new CategoriaBean();

					categoria.setIdCategoria(CategoriaButton.this.categoriaData.getCategoriaId());
					categoria.setDescricao(CategoriaButton.this.categoriaData.getCategoriadescricao());
					categoria.setStatus(CategoriaButton.this.categoriaData.getCategoriaStatus());

					if (CategoriaButton.this.logger.isDebugEnabled()) {
						CategoriaButton.this.logger.debug(String.format("Invoke service to update the category [%s].", categoria));
					}

					try {
						CategoriaButton.this.categoriaGrid.getService().updateCategoria(categoria);

						CategoriaButton.this.fillCategories();
					} catch (Exception ex) {
						JOptionPane.showMessageDialog(CategoriaButton.this, "Não foi possovel acessar os serviços remotos.");
					}
				}
			});
			break;
		}

	}

	private void fillCategories() {
		List<CategoriaBean> categorias = this.categoriaGrid.getService().findAllCategoriaBeans();

		this.categoriaGrid.addCategories(categorias);

		this.categoriaData.clearFields();
	}

}
